﻿# Импорт объектов
from mydb.mysql import atable
from datetime import datetime


class table():
	"This is a manipultor for mysql table"
	#beginning of class suite
	def __init__(self, name, fields):
		self.atable=atable()
		self.atable.name='mob_'+name
		self.atable.fields=[['id','integer','not null','']]+fields
		self.atable.primary='id'
		self.atable.comment='mobiles accounting'

class numbers(table):
	"This is a manipultor for numbers table"
	#beginning of class suite
	def __init__(self):
		super(numbers, self).__init__('numbers', [['number','varchar(11)','not null',''], ['tabnom','integer','',''], ['date_in','date','',''], ['date_out','date','',''], ['comment','varchar(40)','','']])
	
	def create(self):
		"This function creates the numbers table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.create()

	def drop(self):
		"This function drops the numbers table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.drop()

	def exists(self, number):
		"This function checks if the number exists"
		#beginning of function suite
		
		#Если количество номеров=number с пустой датой выбытия больше нуля:
		if self.atable.count([['number','=', number], ['AND date_out','IS', 'NULL'], ['AND tabnom','IS', 'NULL']])>0:
			#Результату присваивается дата ввода номера
			result = str(self.atable.select(['date_in'], [['number','=', number],['AND date_out', 'IS', 'NULL'], ['AND tabnom','IS', 'NULL']])[0][0])
		#Иначе
		else:
			#Результату присваивается False
			result = False
		#end of function suite
		return result
	
	def isset(self, number):
		"This function checks if the number is set to tabnom"
		#beginning of function suite
		
		#Если количество номеров=number с пустой датой выбытия и непустым tabnom больше нуля
		if self.atable.count([['number','=', number], ['AND date_out', 'IS', 'NULL'], ['AND tabnom', 'IS NOT', 'NULL']])>0:
			#Результату присваивается tabnom, которому принадлежит номер
			result = str(self.atable.select(['tabnom'], [['number','=', number],['AND date_out', 'IS', 'NULL'], ['AND tabnom','IS NOT', 'NULL']])[0][0])
		#Иначе
		else:
			#Результату присваивается False
			result = False
		#end of function suite
		return result
	
	def shown(self, number):
		"This function shows rows for the number where date_out is NULL"
		#beginning of function suite
		for item in self.atable.select(['*'], [['number','=', number],['AND date_out', 'IS', 'NULL']]):
			print(item)
		#end of function suite
	
	def showt(self, tabnom):
		"This function shows rows for the tabnom where date_out is NULL"
		#beginning of function suite
		for item in self.atable.select(['*'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']]):
			print(item)
		#end of function suite
	
	def insert(self, number, date=datetime.now(), comment=None):
		"This function inserts mobile number into the numbers table"
		#beginning of function suite
		
		exists=self.exists(number)
		#Если номер существует
		if exists:
			#Результату присваивается дата ввода номера
			result='The number: ' + str(number)+' inserted on '+exists
		#Иначе
		else:
			#Результату присваивается количество добавленных номеров
			result=self.atable.insert(['number', 'date_in', 'comment'], [[number, date, comment]])
		#end of function suite
		#function returns result
		return result
	
	def delete(self, number, date=datetime.now(), comment=None):
		"This function deletes mobile number from the numbers table"
		#beginning of function suite
		
		exists=self.exists(number)
		isset=self.isset(number)
		#Если номер не существует
		if not exists:
			#Результату присваивается строка:
			result=str(number)+' does not exist'
		#Если номер принадлежит сотруднику
		elif isset:
			#Результату присваивается строка:
			result=str(number)+' is set to tabnom: '+isset
		#Иначе
		else:
			#Результату присваивается количество записей, у которых обновляется дата выбытия
			result = self.atable.update({'date_out':date}, [['number','=', number], ['AND date_out', 'IS', 'NULL'], ['AND tabnom', 'IS', 'NULL']])
		#end of function suite
		#function returns result
		return result
	
	def set(self, number, tabnom, date=datetime.now(), comment=None):
		"This function sets tabnom to number of the numbers table"
		#beginning of function suite

		exists=self.exists(number)
		tab_exists=persons().exists(tabnom)
		isset=self.isset(number)
		#Если номер не существует
		if not exists:
			#Результату присваивается строка:
			result=str(number)+' does not exist'
		#Если tabnom не существует
		elif not tab_exists:
			#Результату присваивается строка:
			result=str(tabnom)+' does not exist'
		#Если номер принадлежит сотруднику
		elif isset:
			#Результату присваивается строка:
			result=str(number)+' is set to tabnom: '+isset
		#Иначе
		else:
			#Результату присваивается количество добавленных записей
			result=self.atable.insert(['number', 'tabnom', 'date_in', 'comment'], [[number, tabnom, date, comment]])
		#end of function suite
		#function returns result
		return result
		
	def unset(self, number, tabnom, date=datetime.now(), comment=None):
		"This function unsets tabnom to number of the numbers table"
		#beginning of function suite
		
		isset=self.isset(number)
		#Если номер не принадлежит данному сотруднику
		if isset!=str(tabnom):
			#Результату присваивается строка:
			result=str(number)+' is not set to tabnom: '+str(tabnom)
		#Иначе
		else:
			#Результату присваивается количество обновленных записей
			result=self.atable.update({'date_out':date}, [['number','=', number], ['AND date_out', 'IS', 'NULL'], ['AND tabnom', '=', tabnom]])
		#end of function suite
		#function returns result
		return result



class persons(table):
	"This is a manipultor for persons table"
	#beginning of class suite
	def __init__(self):
		super(persons, self).__init__('persons', [['tabnom','integer','not null',''], ['fio','varchar(200)','not null',''], ['dolzn','varchar(200)','not null',''], ['date_in','date','',''], ['date_out','date','',''], ['comment','varchar(40)','','']])

	def create(self):
		"This function creates the persons table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.create()

	def drop(self):
		"This function drops the persons table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.drop()

	def exists(self, tabnom):
		"This function checks if the tabnom exists"
		#beginning of function suite
		
		#Если количество сотрудников=tabnom с пустой датой выбытия больше нуля:
		if self.atable.count([['tabnom','=', tabnom], ['AND date_out','IS', 'NULL']])>0:
			#Результату присваивается дата ввода tabnom
			result = str(self.atable.select(['date_in'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']])[0][0])
		#Иначе
		else:
			#Результату присваивается False
			result = False
		#end of function suite
		return result
	
	def isset(self, tabnom):
		"This function checks if the tabnom is set to a number"
		#beginning of function suite
		result = False
		#Если количество номеров с пустой датой выбытия и tabnom=tabnom больше нуля
		if numbers().atable.count([['tabnom','=', tabnom], ['AND date_out', 'IS', 'NULL']])>0:
			#Результату присваивается номер, который принадлежит данному tabnom
			result = numbers().atable.select(['number'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']])[0][0]
		#Иначе
		else:
			#Результату присваивается False
			result = False
		#end of function suite
		return result
		
	def show(self, tabnom):
		"This function shows rows for the tabnom where date_out is NULL"
		#beginning of function suite
		for item in self.atable.select(['*'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']]):
			print(item)
		#end of function suite
	
	def insert(self, tabnom, fio, dolzn, date=datetime.now(), comment=None):
		"This function inserts person into the persons table"
		#beginning of function suite
	
		exists=self.exists(tabnom)
		#Если tabnom существует
		if exists:
			#Результату присваивается дата ввода tabnom
			result='The tabnom: ' + str(tabnom)+' inserted on '+exists
		#Иначе
		else:
			#Результату присваивается количество добавленных номеров
			result=self.atable.insert(['tabnom', 'fio', 'dolzn', 'date_in', 'comment'], [[tabnom, fio, dolzn, date, comment]])
			#В таблицу лимитов добавляется запись
			limits().insert(100, tabnom, date, comment)
		#end of function suite
		#function returns result
		return result
			
		
	def delete(self, tabnom, date=datetime.now(), comment=None):
		"This function sets date_out for the person in the persons table"
		#beginning of function suite
		
		exists=self.exists(tabnom)
		isset=self.isset(tabnom)
		#Если номер не существует
		if not exists:
			#Результату присваивается строка:
			result=str(tabnom)+' does not exist'
		#Если номер принадлежит сотруднику
		elif isset:
			#Результату присваивается строка:
			result=str(tabnom)+' is set to number: '+isset
		#Иначе
		else:
			#Результату присваивается количество записей, у которых обновляется дата выбытия
			result = self.atable.update({'date_out':date}, [['tabnom','=', tabnom], ['AND date_out', 'IS', 'NULL']])
			#В таблице лимитов удаляется запись
			limits().delete(tabnom, date, comment)
		#end of function suite
		#function returns result
		return result
		

class limits(table):
	"This is a manipultor for limits table"
	#beginning of class suite
	def __init__(self):
		super(limits, self).__init__('limits', [['sum','decimal(8,2)','not null',''], ['tabnom','integer','not null',''], ['date_in','date','not null',''], ['date_out','date','',''], ['comment','varchar(40)','','']])

	def create(self):
		"This function creates the persons table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.create()

	def drop(self):
		"This function drops the persons table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.drop()

	def exists(self, tabnom):
		"This function checks if the limit for the tabnom exists"
		#beginning of function suite
		
		#Если количество сотрудников=tabnom с пустой датой выбытия больше нуля:
		if self.atable.count([['tabnom','=', tabnom], ['AND date_out','IS', 'NULL']])>0:
			#Результату присваивается дата ввода лимита
			result = str(self.atable.select(['date_in'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']])[0][0])
		#Иначе
		else:
			#Результату присваивается False
			result = False
		#end of function suite
		return result

	def show(self, tabnom):
		"This function shows rows for the tabnom where date_out is NULL"
		#beginning of function suite
		for item in self.atable.select(['*'], [['tabnom','=', tabnom],['AND date_out', 'IS', 'NULL']]):
			print(item)
		#end of function suite

	def insert(self, tabnom, sum, date=datetime.now(), comment=None):
		"This function inserts person limit into the limits table"
		#beginning of function suite
		
		exists=self.exists(tabnom)
		#Если tabnom существует
		if exists:
			#Результату присваивается дата ввода tabnom
			result='The limit for tabnom: ' + str(tabnom)+' inserted on '+exists
		#Иначе
		else:
			#Результату присваивается количество добавленных номеров
			result=self.atable.insert(['sum', 'tabnom', 'date_in', 'comment'], [[sum, tabnom, date, comment]])
		#end of function suite
		#function returns result
		return result
		
	def delete(self, tabnom, date=datetime.now(), comment=None):
		"This function sets date_out for the person limit in the limits table"
		#beginning of function suite
		
		exists=self.exists(tabnom)
		#Если номер не существует
		if not exists:
			#Результату присваивается строка:
			result='limit for tabnom: '+str(tabnom)+' does not exist'
		#Иначе
		else:
			#Результату присваивается количество записей, у которых обновляется дата выбытия
			result = self.atable.update({'date_out':date}, [['tabnom','=', tabnom], ['AND date_out', 'IS', 'NULL']])
		#end of function suite
		#function returns result
		return result
	
	def change(self, tabnom, sum, date=datetime.now(), comment=None):
		"This function changes the person limit in the limits table"
		#beginning of function suite
		rd=self.delete(tabnom, date, comment)
		ri=self.insert(tabnom, sum, date, comment)
		#end of function suite
		#function returns number of rows inserted
		return [rd, ri]


class talks(table):
	"This is a manipultor for talks table"
	#beginning of class suite
	def __init__(self):
		super(talks, self).__init__('talks', [['number','varchar(11)','not null',''], ['bill_date','date','',''], ['minutes','decimal(8,2)','',''], ['rubles','decimal(8,2)','',''], ['comment','varchar(40)','','']])
	
	def create(self):
		"This function creates the numbers table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.create()

	def drop(self):
		"This function drops the numbers table in mysql db"
		#beginning of function suite
		#end of function suite
		return self.atable.drop()